/**
 * 
 */
package co.edu.uniquindio.pruebas;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.embeddable.EJBContainer;
import javax.naming.NamingException;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import co.edu.uniquindio.dao.CalificacionDao;
import co.edu.uniquindio.dao.CompradorDao;
import co.edu.uniquindio.dao.PaisDao;
import co.edu.uniquindio.dao.VendedorDao;
import co.edu.uniquindio.logica.Calificacion;
import co.edu.uniquindio.logica.Comprador;
import co.edu.uniquindio.logica.Pais;
import co.edu.uniquindio.logica.Vendedor;


/**
 * 
 * Prueba implementation class for: PruebaCalificacion
 * El proposito de esta clase es el probar  la
 * DAO relacionada con la informacion de una calificacion.
 * @author Andres Felipe Abril 
 * @author Luis Enrique Robledo
 *
 */
public class PruebaCalificacion {
	
	/**
	 * contenedor en el cual se manejara la instancia del EJB que 
	 * maneja los datos que se utilizaran para la prueba
	 */
	private EJBContainer contenedor;
	/**
	 * este atributo es un instancia de la clase CalificacionDao
	 */
	private CalificacionDao calificacionDao;
	/**
	 * metodo de la clase PruebaCalificacion el cual 
	 * configura las condiciones iniciales para hacer la prueba.
	 */
    @Before
	public void configurar()
	{
		Map<String,String> properties = new HashMap<String,String>();
		properties.put(EJBContainer.APP_NAME, "Subasta");
		System.out.println(EJBContainer.APP_NAME);
	     contenedor = EJBContainer.createEJBContainer(properties);
	}
    /**
	 * este metodo es para regresar a todas las condiciones iniciales
	 * antes de la prueba a excepcion de lo incertado en la BD que se hace
	 * al cerrar el contenedor en el cual se encapsula la instancia del EJB
	 * 
	 */
	@After
	public void terminar()
	{
		contenedor.close();
	}
	/**
	 * Metodo en el cual se hacen diversas incersiones en la BD atravez de
	 * de la DAO pertinente relacionada a la calificacion para despues verificar
	 * los datos obtenidos atravez de la misma DAO. 
	 * @throws NamingException
	 */
    @Test
    public void testCrudCalificacion() throws NamingException 
    {
    	VendedorDao vendedorDao=(VendedorDao)contenedor.getContext().lookup("java:global/Subasta/VendedorDao");
    	CompradorDao compradorDao=(CompradorDao)contenedor.getContext().lookup("java:global/Subasta/CompradorDao");
		PaisDao paisDao=(PaisDao)contenedor.getContext().lookup("java:global/Subasta/PaisDao");

		Pais pais=new Pais("av123",new Date(),"colombia");
		//paisDao.insert(pais);
		
		Vendedor vendedor= new Vendedor("123","asd@hotmail","carlos",pais,"paco","43343");
		//vendedorDao.insert(vendedor);
		
		Comprador comprador= new Comprador("456","edrt@gmail","laura",pais,"lau","dog");
		//compradorDao.insert(comprador);
		
    	calificacionDao=(CalificacionDao)contenedor.getContext().lookup("java:global/Subasta/CalificacionDao");
    	
    	//prueba de insercion
    	Calificacion calificacion=new Calificacion(8, 10, vendedor, comprador);
    	//calificacionDao.insert(calificacion);
    	//Assert.assertEquals(8, calificacion.getCodigo());
    	
    	//Prueba de búsqueda
    	Calificacion calificacionRecuperada= calificacionDao.findByKey(calificacion.getCodigo());
    	Assert.assertEquals(calificacionRecuperada.getCodigo(), calificacion.getCodigo());
    	
    	//Prueba actualización
    	calificacionRecuperada.setCodigo(34);
    	calificacionRecuperada.setPuntaje(20);
        calificacionDao.update(calificacionRecuperada);
        calificacion= calificacionDao.findByKey(calificacionRecuperada.getCodigo());
        Assert.assertEquals(34,calificacion.getCodigo());
    	
      //Prueba getAll
        Calificacion otraCalificacion=new Calificacion();
        otraCalificacion.setCodigo(109);
        otraCalificacion.setPuntaje(100);
        otraCalificacion.setVendedor(vendedor);
        calificacionDao.insert(otraCalificacion);
        List<Calificacion>calificaciones=calificacionDao.getAll();
    	Assert.assertTrue(calificaciones.contains(otraCalificacion));
        Assert.assertTrue(calificaciones.contains(calificacion));    	
    	
      //Prueba delete
//        calificacionDao.remove(otraCalificacion);
//        calificacionDao.remove(calificacion);
//        calificaciones=calificacionDao.getAll();
//        Assert.assertTrue(!calificaciones.contains(otraCalificacion));
//        Assert.assertTrue(!calificaciones.contains(calificacion));    	
//    	
    	// prueba lista
    	Calificacion cali =calificacionDao.maxCalificacion(vendedor);
    	Assert.assertEquals(100,calificacion.getPuntaje());
    }
    	
    

}
